package com.excetop.xservlet.resp;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

/**
 * 结果/回答/响应数据表
 * @author xuZW
 *
 */
public class ResultMap extends HashMap<String, Object> {
	
	private static final long serialVersionUID = 1L;
	
	/**
	 * Key值 - 请求结果（是否成功）
	 */
	public static final String KEY_SUCCESS = "success";
	
	/**
	 * Key值 - 返回信息
	 */
	public static final String KEY_MSG = "msg";
	
	/**
	 * Key值 - 响应时间
	 */
	public static final String KEY_RESPONSE_DATE = "responseDate";
	
	/**
	 * Key值 - 输入流
	 */
	public static final String KEY_INPUT_STREAM = "_inputStream";
	
	/**
	 * Key值 - 缓冲区大小, 按字节(byte)
	 */
	public static final String KEY_BUFFER_SIZE = "_bufferSize";
	
	/**
	 * Key值 - 内容类型
	 */
	public static final String KEY_CONTENT_TYPE = "_contentType";
	
	/**
	 * Key值 - 内容长度
	 */
	public static final String KEY_CONTENT_LENGTH = "_contentLength";
	
	/**
	 * Key值 - HTML 代码
	 */
	public static final String KEY_HTML_CODE = "_htmlCode";
	
	/**
	 * Key值 - 编码
	 */
	public static final String KEY_ENCODING = "_encoding";
	
	/**
	 * 设置请求结果，成功
	 */
	public void success(){
		put(KEY_SUCCESS, Boolean.TRUE);
	}
	
	/**
	 * 设置请求结果，成功
	 * @param msg
	 */
	public void success(String msg){
		put(KEY_SUCCESS, Boolean.TRUE);
		if(null != msg){ put(KEY_MSG, msg); }
	}
	
	/**
	 * 设置请求结果，成功
	 * @param msg
	 * @param params
	 */
	public void success(String msg, Object... params){
		put(KEY_SUCCESS, Boolean.TRUE);
		if(null != msg){ put(KEY_MSG, fillStr(msg, params)); }
	}
	
	/**
	 * 设置请求结果，失败
	 */
	public void fail(){
		put(KEY_SUCCESS, Boolean.FALSE);
	}
	
	/**
	 * 设置请求结果，失败
	 * @param msg
	 */
	public void fail(String msg){
		put(KEY_SUCCESS, Boolean.FALSE);
		if(null != msg){ put(KEY_MSG, msg); }
	}
	
	/**
	 * 设置请求结果，失败
	 * @param msg
	 * @param params
	 */
	public void fail(String msg, Object... params){
		put(KEY_SUCCESS, Boolean.FALSE);
		if(null != msg){ put(KEY_MSG, fillStr(msg, params)); }
	}
	
	/**
	 * 返回填充后的字符串，字符"?"为占位符，"\"为转义字符。
	 * 
	 * 例：假设参数 str = "请问著名诗句\"?日?, 汗滴禾下?\"是何人所作\?", params={"倭国版何润东", "苍老师", "草泥马"}，
	 * 则返回 "请问著名诗句\"倭国版何润东日苍老师, 汗滴禾下草泥马\"是何人所作?"。
	 * 
	 * @param str
	 * @param params
	 * @return
	 */
	private String fillStr(String str, Object... params){
		StringBuilder result = new StringBuilder();
		if(null != str){
			String[] strParts = str.split("\\?", -1);
			if(null != strParts && strParts.length > 1){
				List<String> _strParts = new ArrayList<String>();
				_strParts.add(strParts[0]);
				for (int i = 1; i < strParts.length; i++) {
					int lastIndex = _strParts.size() - 1;
					String lastStr = _strParts.get(lastIndex);
					if(lastStr.endsWith("\\")){
						_strParts.set(lastIndex, lastStr.replaceAll("\\\\$", "?") + strParts[i]);
					}else{
						_strParts.add(strParts[i]);
					}
				}
				int size = _strParts.size();
				for (int i = 0; i < size; i++) {
					result.append(_strParts.get(i));
					if(null != params && i < size -1 && i < params.length){
						result.append(params[i]);
					}
				}
			}else{
				result.append(str);
			}
		}
		return result.toString();
	}
	
	/**
	 * 返回消息
	 * @return
	 */
	public String getMsg(){
		return (String) get(KEY_MSG);
	}
	
	/**
	 * 设置消息
	 * @param msg
	 */
	public void setMsg(String msg){
		put(KEY_MSG, msg);
	}
	
	/**
	 * 设置消息
	 * @param msg
	 * @param params
	 */
	public void setMsg(String msg, Object... params){
		put(KEY_MSG, fillStr(msg, params));
	}
	
	/**
	 * 返回内容类型
	 * @return
	 */
	public String getContentType(){
		return (String) get(KEY_CONTENT_TYPE);
	}
	
	/**
	 * 设置内容类型
	 * @param contentType
	 */
	public void setContentType(String contentType){
		put(KEY_CONTENT_TYPE, contentType);
	}
	
	/**
	 * 返回字节长度
	 * @return
	 */
	public Integer getContentLength(){
		return (Integer) this.get(KEY_CONTENT_LENGTH);
	}
	
	/**
	 * 设置字节长度
	 * @param contentLength
	 */
	public void setContentLength(int contentLength){
		this.put(KEY_CONTENT_LENGTH, contentLength);
	}
	
	/**
	 * 返回输入流
	 * @return
	 */
	public InputStream getInputStream(){
		return (InputStream) get(KEY_INPUT_STREAM);
	}
	
	/**
	 * 设置输入流
	 * @param inputStream
	 */
	public void setInputStream(InputStream inputStream){
		put(KEY_INPUT_STREAM, inputStream);
	}
	
	/**
	 * 返回缓冲区大小
	 * @return
	 */
	public int getBufferSize(){
		int size = 0;
		Object obj = get(KEY_BUFFER_SIZE);
		if(null != obj){ size = (Integer) obj; }
		return size;
	}
	
	/**
	 * 设置缓冲区大小
	 * @param bufferSize
	 */
	public void setBufferSize(int bufferSize){
		put(KEY_BUFFER_SIZE, bufferSize);
	}
	
	/**
	 * 设置响应时间为当前时间
	 */
	public void setResponseDateEqNow(){
		put(KEY_RESPONSE_DATE, new Date());
	}
	
	/**
	 * 返回 HTML 代码
	 * @return
	 */
	public String getHtmlCode(){
		return (String) get(KEY_HTML_CODE);
	}
	
	/**
	 * 设置 HTML 代码
	 * @param htmlCode
	 */
	public void setHtmlCode(String htmlCode){
		put(KEY_HTML_CODE, htmlCode);
	}

	/**
	 * 返回 编码
	 * @return
	 */
	public String getEncoding(){
		return (String) get(KEY_ENCODING);
	}
	
	/**
	 * 设置 编码
	 * @param encoding
	 */
	public void setEncoding(String encoding){
		put(KEY_ENCODING, encoding);
	}
	
}
